Aller au contenu principal

Tableaux, Slices et Maps

Les tableaux et les slices

Les tableaux et les slices sont des structures permettant de stocker des collections d'éléments. Cependant, ils diffèrent dans leur nature et dans leur utilisation.

Un tableau est une collection d'éléments de même type à taille fixe non modifiable. Tandis qu'un slice est une collection d'éléments de même type à taille non définie et modifiable.

Créer un tableau

Il est possible de créer un tableau de différentes manières telles que :

  • // Déclaration du tableau et de sa taille
    var list [2]int
    // Assignation des valeurs
    a[0] = 1 // -> list = [1, 0]
    a[1] = 2 // -> list = [1, 2]
  • // Déclaration du tableau et de sa taille avec assignation directe des valeurs
    var list = [2]int{1, 2} // -> list = [1, 2]
  • // Il est également possible de laisser le compilateur définir la taille du tableau
    // Attention, cela ne signifie pas que la taille du tableau est modifiable
    var list = [...]int{1, 2} // -> list = [1, 2]
  • // Création d'un tableau avec une affectation dynamique
    list := [2]int{1, 2} // -> list = [1, 2]

Utiliser un tableau

On peut accéder à un élément d'un tableau en utilisant son index.

var list [2]int = [2]int{1, 2}
// Accès à l'élément d'index 0 du tableau
fmt.Println(list[0])

On peut également récupérer la taille d'un tableau.

 list := [2]int{1, 2}
// Récupérer la taille du tableau
len(list) // -> 2

Enfin, il possible de parcourir un tableau avec une boucle for.

 // Parcourir le tableau dans une boucle avec la méthode range
for index, value := range list {
fmt.Println(index, value)
}

Créer un slice

Passons maintenant aux slices. La création d'un slice est similaire à celle d'un tableau, cependant, lors de la déclaration, on ne définit pas forcément sa taille et celle-ci reste variable.

Les slices peuvent utiliser les mêmes méthodes que les tableaux, cependant, ils peuvent également utiliser la méthode append qui permet d'ajouter un élément à la fin du slice.

On utilisera la méthode make pour créer un slice, ce qui permettra de configurer les paramètres du slice et de leur réserver de l'espace mémoire.

La méthode make prend en paramètre le type du slice, la taille du slice et optionnellement la capacité du slice. La taille indiquée initialise le slice avec des valeurs par défaut afin de remplir le slice. La capcité correspond à la taille maximale que peut atteindre le slice avant de devoir réallouer de l'espace mémoire, par défaut si la capacité n'est pas spécifiée, elle est de la taille du slice.

On peut utiliser ces différentes méthodes pour créer un slice :

  • // Création d'un slice contenant des entiers de taille 0
    var list = make([]int, 0)
    // Utilisation de la méthode append pour ajouter des éléments au slice
    list = append(list, 1) // -> list = [1]
    list = append(list, 2) // -> list = [1, 2]
  • // Création d'un slice contenant des entiers avec une taille de 2 et une capacité de 2
    var list = make([]int, 2, 2)
    // Utilisation de la méthode append pour ajouter des éléments au slice
    list = append(list, 1, 2) // -> list = [1, 2]
    list = append(list, 3) // -> list = [1, 2, 3] (la capacité du slice est atteinte et le slice est réalloué)
  • // Création d'un slice avec une affectation dynamique
    list := append(make([]int, 0), 1, 2, 3, 4) // -> list = [1, 2, 3, 4]

Les maps

Une map est une structure permettant de stocker des données sous forme de clé/valeur. Les clés et les valeurs peuvent être de n'importe quel type. Elle est similaire à une table de hashage ou un dictionnaire.

Comme pour les slices, on utilisera la méthode make pour créer une map, la seule différence est que l'on ne peut pas spécifier la capacité de la map en paramètre et que la taille est optionnelle.

Créer une map

On peut créer une map de différentes manières telles que :

  • // Création d'une map avec des clés de type string et des valeurs de type int
    var list = make(map[string]int)
    list["a"] = 1 // -> list["a"] = 1
    list["b"] = 2 // -> list["b"] = 2
  • // Création d'une map avec affectation dynamique de taille 2
    list := make(map[string]int, 2)
    list["a"] = 1 // -> list["a"] = 1
    list["b"] = 2 // -> list["b"] = 2
  • // Déclaration d'une map sans make avec assignation directe des valeurs.
    list := map[string]int{
    "a": 1,
    "b": 2,
    }

Utiliser une map

On peut accéder à une valeur d'une map en utilisant sa clé.

list := map[string]int{
"a": 1,
"b": 2,
}
// Accès à la valeur de la clé "a"
fmt.Println(list["a"])

On peut également récupérer la taille d'une map.

list := map[string]int{
"a": 1,
"b": 2,
}

// Récupérer la taille de la map
len(list) // -> 2

Enfin, il possible de parcourir une map avec une boucle for.

list := map[string]int{
"a": 1,
"b": 2,
}

// Parcourir la map dans une boucle avec la méthode range
for key, value := range list {
fmt.Println(key, value)
}